package com.lyun.common;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;

/**
 * 统一异常处理
 *
 * @author yanbin
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    //private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    private static final String BUSINESS_EXCEPTIONS = "业务异常";

    private static final String LOGIN_EXCEPTIONS = "登录过期";


    /**
     * 统一业务异常处理
     *
     * @param req
     * @param ex
     * @return
     */
    @ExceptionHandler(MyBusinessException.class)
    public R handleMyBusinessException(HttpServletRequest req, final MyBusinessException ex) {
        toLog(BUSINESS_EXCEPTIONS, req.getRequestURI(), ex.getMessage());
        return R.error(ex.getMessage());
    }

    /**
     * token过期异常捕获
     *
     * @param req
     * @param ex
     * @return
     */
    @ExceptionHandler(LoginExpiredException.class)
    @ResponseBody
    public R handleLoginExpiredException(HttpServletRequest req, final LoginExpiredException ex) {
        toLog(LOGIN_EXCEPTIONS, req.getRequestURI(), ex.getMessage());
        return R.loginExpire(ex.getMessage());
    }

//
//    /**
//     * 登录异常（系统自带-商家端）
//     *
//     * @param req
//     * @param ex
//     * @return
//     */
//    @ExceptionHandler(MyNotLoginException.class)
//    public R handleNotLoginException(HttpServletRequest req, final MyNotLoginException ex) {
//        toLog("登录异常", req.getRequestURI(), ex.getMessage());
//        log.error("==> 登录异常：", ex);
//        return R.badRequest(ex.getMessage(), ResponseStatusCode.NEED_LOGIN);
//    }
//
//    /**
//     * 登录异常（sa-token）
//     *
//     * @param req
//     * @param ex
//     * @return
//     */
//    @ExceptionHandler(NotLoginException.class)
//    public R handleNotLoginException(HttpServletRequest req, final NotLoginException ex) {
//        toLog("登录异常", req.getRequestURI(), ex.getMessage());
//        log.error("==> 登录异常：", ex);
//        return R.badRequest(ex.getMessage(), ResponseStatusCode.NEED_LOGIN);
//    }


//
//    /**
//     * 参数解析异常
//     *
//     * @param req
//     * @param ex
//     * @return
//     */
//    @ExceptionHandler(HttpMessageNotReadableException.class)
//    public R handleHttpMessageNotReadableException(HttpServletRequest req, final HttpMessageNotReadableException ex) {
//        toLog("参数解析异常", req.getRequestURI(), ex.getMessage());
//        log.error("==> 参数解析异常：", ex);
//        return R.badRequest("请求参数解析异常", ResponseStatusCode.PARAM_ERROR);
//    }

//    /**
//     * 参数校验异常
//     *
//     * @param req
//     * @param ex
//     * @return
//     */
//    @ExceptionHandler(MethodArgumentNotValidException.class)
//    public R handleMethodArgumentNotValidException(HttpServletRequest req, final MethodArgumentNotValidException ex) {
//        String msg = ex.getBindingResult().getAllErrors().stream().map(ObjectError::getDefaultMessage).collect(Collectors.joining(","));
//        toLog("参数校验异常", req.getRequestURI(), msg);
//        log.error("==> 参数校验异常：", ex);
//        return R.badRequest(msg, ResponseStatusCode.PARAM_ERROR);
//    }
//
//    /**
//     * 未知系统异常
//     *
//     * @param req
//     * @param ex
//     * @return
//     */
//
//    @ExceptionHandler(value = Exception.class)
//    public R otherExceptionHandler(HttpServletRequest req, Exception ex) {
//        toLog("未知系统异常", req.getRequestURI(), ex.getMessage());
//        log.error("==> 未知系统异常：", ex);
//
//        String msg = "";
//
//        Throwable cause = ex.getCause();
//        if (cause == null) {
//            msg = ex.getMessage();
//        } else { // 向上找到第一个错误信息
//            Throwable prevCause = cause;
//
//            while (true) {
//                cause = prevCause.getCause();
//                if (cause == null) {
//                    msg = prevCause.getMessage();
//                    break;
//                }
//                prevCause = cause;
//            }
//        }
//
////        return R.badRequest("系统异常，操作失败", ResponseStatusCode.PARAM_ERROR);
//
//        return R.error(msg, ResponseStatusCode.PARAM_ERROR);
//    }


    /**
     * 统一打印日志
     *
     * @param title    错误标题
     * @param uri      错误uri
     * @param errorMsg 错误原因
     */
    private static void toLog(String title, String uri, String errorMsg) {
        log.error("\n==> {}：\n[{}]\n[{}]", title, uri, errorMsg);
    }
}
